home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bytesc88.arc / CC21.C < prev    next >
Text File  |  1987-10-04  |  5KB  |  246 lines

  1. /*
  2. ** Small C - 8088/8086 version - modified by R. Grehan, BYTE Magazine
  3. */
  4.  
  5. junk() {
  6.   if(an(inbyte())) while(an(cch)) gch();
  7.   else while(an(cch)==0) {
  8.     if(cch==0) break;
  9.     gch();
  10.     }
  11.   blanks();
  12.   }
  13.  
  14. endst() {
  15.   blanks();
  16.   return ((streq(lptr,";")|(cch==0)));
  17.   }
  18.  
  19. illname() {
  20.   error("illegal symbol");
  21.   junk();
  22.   }
  23.   
  24. multidef(sname)  char *sname; {
  25.   error("already defined");
  26.   }
  27.  
  28. needtoken(str)  char *str; {
  29.   if (match(str)==0) error("missing token");
  30.   }
  31.  
  32. needlval() {
  33.   error("must be lvalue");
  34.   }
  35.  
  36. findglb(sname)  char *sname; {
  37.   if(search(sname, STARTGLB, SYMMAX, ENDGLB, NUMGLBS, NAME))
  38.     return cptr;
  39.   return 0;
  40.   }
  41.  
  42. findloc(sname)  char *sname;  {
  43.   cptr = locptr - 1;        /* search backward for block locals */
  44.   while(cptr > STARTLOC) {
  45.     cptr = cptr - *cptr;
  46.     if(astreq(sname, cptr, NAMEMAX)) return (cptr - NAME);
  47.     cptr = cptr - NAME - 1;
  48.     }
  49.   return 0;
  50.   }
  51.  
  52. addsym(sname, id, typ, value, lgptrptr, class)
  53.   char *sname, id, typ;  int value, *lgptrptr, class; {
  54.   if(lgptrptr == &glbptr) {
  55.     if(cptr2=findglb(sname)) return cptr2;
  56.     if(cptr==0) {
  57.       error("global symbol table overflow");
  58.       return 0;
  59.       }
  60.     }
  61.   else {
  62.     if(locptr > (ENDLOC-SYMMAX)) {
  63.       error("local symbol table overflow");
  64.       abort(ERRCODE);
  65.       }
  66.     cptr = *lgptrptr;
  67.     }
  68.   cptr[IDENT]=id;
  69.   cptr[TYPE]=typ;
  70.   cptr[CLASS]=class;
  71.   putint(value, cptr+OFFSET, OFFSIZE);
  72.   cptr3 = cptr2 = cptr + NAME;
  73.   while(an(*sname)) *cptr2++ = *sname++;
  74.   if(lgptrptr == &locptr) {
  75.     *cptr2 = cptr2 - cptr3;    /* set length */
  76.     *lgptrptr = ++cptr2;
  77.     }
  78.   return cptr;
  79.   }
  80.  
  81. nextsym(entry) char *entry; {
  82.   entry = entry + NAME;
  83.   while(*entry++ >= ' ');    /* find length byte */
  84.   return entry;
  85.   }
  86.  
  87. /*
  88. ** get integer of length len from address addr
  89. ** (byte sequence set by "putint")
  90. */
  91. getint(addr, len) char *addr; int len; {
  92.   int i;
  93.   i = *(addr + --len);        /* high order byte sign extended */
  94.   while(len--) i = (i << 8) | *(addr+len)&255;
  95.   return i;
  96.   }
  97.  
  98. /*
  99. ** put integer i of length len into address addr
  100. ** (low byte first)
  101. */
  102. putint(i, addr, len) char *addr; int i, len; {
  103.   while(len--) {
  104.     *addr++ = i;
  105.     i = i>>8;
  106.     }
  107.   }
  108.  
  109. /*
  110. ** test if next input string is legal symbol name
  111. */
  112. symname(sname, ucase) char *sname; int ucase; {
  113.   int k;char c;
  114.   blanks();
  115.   if(alpha(cch)==0) return (*sname=0);
  116.   k=0;
  117.   while(an(cch)) {
  118. #ifdef UPPER
  119.     if(ucase)
  120.       sname[k]=toupper(gch());
  121.     else
  122. #endif
  123.       sname[k]=gch();
  124.     if(k<NAMEMAX) ++k;
  125.     }
  126.   sname[k]=0;
  127.   return 1;
  128.   }
  129.  
  130. /*
  131. ** return next avail internal label number
  132. */
  133. getlabel() {
  134.   return(++nxtlab);
  135.   }
  136.  
  137. /*
  138. ** post a label in the program
  139. */
  140. postlabel(label) int label; {
  141.   printlabel(label);
  142.   col();
  143.   nl();
  144.   }
  145.  
  146. /*
  147. ** print specified number as a label
  148. */
  149. printlabel(label)  int label; {
  150.   outstr("_CC");
  151.   outdec(label);
  152.   }
  153.  
  154. /*
  155. ** test if c is alphabetic
  156. */
  157. alpha(c)  char c; {
  158.   return (isalpha(c) || c=='_');
  159.   }
  160.  
  161. /*
  162. ** test if given character is alphanumeric
  163. */
  164. an(c)  char c; {
  165.   return (alpha(c) || isdigit(c));
  166.   }
  167.  
  168. addwhile(ptr)  int ptr[]; {
  169.   int k;
  170.   ptr[WQSP]=csp;        /* and stk ptr */
  171.   ptr[WQLOOP]=getlabel();    /* and looping label */
  172.   ptr[WQEXIT]=getlabel();    /* and exit label */
  173.   if (wqptr==WQMAX) {
  174.     error("too many active loops");
  175.     abort(ERRCODE);
  176.     }
  177.   k=0;
  178.   while (k<WQSIZ) *wqptr++ = ptr[k++];
  179.   }
  180.  
  181. delwhile() {
  182.   if (wqptr > wq) wqptr=wqptr-WQSIZ;
  183.   }
  184.  
  185. readwhile(ptr) int *ptr; {
  186.   if (ptr <= wq) {
  187.     error("out of context");
  188.     return 0;
  189.     }
  190.   else return (ptr-WQSIZ);
  191.  }
  192.  
  193. white() {
  194. #ifdef DYNAMIC
  195.   /* test for stack/prog overlap at deepest nesting */
  196.   /* primary -> symname -> blanks -> white */
  197.   avail(YES);        /* abort on stack overflow */
  198. #endif
  199.   return (*lptr<= ' ' && *lptr!=NULL);
  200.   }
  201.  
  202. gch() {
  203.   int c;
  204.   if(c=cch) bump(1);
  205.   return c;
  206.   }
  207.  
  208. bump(n) int n; {
  209.   if(n) lptr=lptr+n;
  210.   else  lptr=line;
  211.   if(cch=nch = *lptr) nch = *(lptr+1);
  212.   }
  213.  
  214. kill() {
  215.   *line=0;
  216.   bump(0);
  217.   }
  218.  
  219. inbyte()  {
  220.   while(cch==0) {
  221.     if (eof) return 0;
  222.     preprocess();
  223.     }
  224.   return gch();
  225.   }
  226.  
  227. inline() {            /* numerous revisions */
  228.   int k,unit;
  229.   poll(1);            /* allow operator interruption */
  230.   if (input==EOF) openfile();
  231.   if(eof) return;
  232.   if((unit=input2)==EOF) unit=input;
  233.   if(fgets(line, LINEMAX, unit)==NULL) {
  234.     fclose(unit);
  235.     if(input2!=EOF) input2=EOF;
  236.     else input=EOF;
  237.     *line=NULL;
  238.     }
  239.   else if(listfp) {
  240.     if(listfp==output) cout(';', output);
  241.     sout(line, listfp);
  242.     }
  243.   bump(0);
  244.   }
  245.  
  246.